//
// Created by wang on 2021/7/4.
//

#include "ers.h"

err_module g_err_modules[ERR_MAX_MODULE];

/* Must be called at system start-up */
void err_init() {
    memset(&g_err_modules, 0, sizeof g_err_modules);
    err_register_all();
}

uint32_t err_register_all() {
    int32_t i;
    uint32_t ret;

    for (i = 0; i < ERR_MAX_MODULE; i++) {

        ret = err_register(i, g_err_procs[i]);
        if (ret != ENET_RET_SUCCESS)
            return ret;
    }

    return ENET_RET_SUCCESS;
}

uint32_t err_register(uint8_t model_id, err_proc *proc) {
    if (model_id >= ERR_MAX_MODULE) {
        return ERR_ERR_INVALID_MODULE_ID;
    }
    else if (ERR_REGISTERED == g_err_modules[model_id].reg_flag) {
        return ERR_ERR_MODULE_REGISTERED;
    }

    if (ERR_UNREGISTERED == g_err_modules[model_id].reg_flag) {
        g_err_modules[model_id].proc = proc;
    }

    return ENET_RET_SUCCESS;
}

char* err_to_str( uint32_t err, char errbuf[ERR_PROC_MAX_DESC_LEN]) {

    uint32_t mod_idx = err >> ERR_IDX_BIT;
    uint32_t idx_msk = (err & ERR_IDX_MASK) - 1;
    if (mod_idx >= ERR_MAX_MODULE || idx_msk >= g_err_max_tbl[mod_idx])
        return NULL;

    char *desc = g_err_modules[ERR_MOD_IDX(err)].proc[ERR_ERR_IDX(err)].desc;
    if (errbuf)  {
        memcpy(errbuf, desc, ERR_PROC_MAX_DESC_LEN);
    }
    return desc;
}
